package com.dimples.dd.system.service;

import com.dimples.dd.system.model.form.RoleHomeForm;

import java.util.List;
import java.util.Set;

/**
 * 权限 Service 接口
 * <p>
 * 提供用户-角色、角色-菜单、角色-部门的关联权限处理
 *
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2024/7/9
 */
public interface PermissionService {

    /**
     * 刷新权限缓存(所有角色)
     */
    void refreshRolePermsCache();

    /**
     * 刷新权限缓存(指定角色)
     *
     * @param roleCode 角色编码
     */
    void refreshRolePermsCache(String roleCode);

    /**
     * 刷新权限缓存(修改角色编码时调用)
     *
     * @param oldRoleCode 旧角色编码
     * @param newRoleCode 新角色编码
     */
    void refreshRolePermsCache(String oldRoleCode, String newRoleCode);

    /**
     * 保存用户角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID集合
     */
    void saveUserRoles(Long userId, List<Long> roleIds);

    /**
     * 判断角色是否存在绑定的用户
     *
     * @param roleId 角色ID
     * @return true：已分配 false：未分配
     */
    boolean hasAssignedUsers(Long roleId);

    /**
     * 判断角色是否被分配
     *
     * @param roleIds 角色ID
     * @return true：已分配角色Id
     */
    List<Long> selectRoleIdsExistAssignedUsers(List<Long> roleIds);

    /**
     * 处理菜单删除时，删除关联授权数据
     *
     * @param menuId 菜单编号
     */
    void processMenuDeleted(Long menuId);

    /**
     * 获取角色的菜单ID集合
     *
     * @param roleId 角色ID
     * @return 菜单ID集合(包括按钮权限ID)
     */
    List<Long> getRoleMenuIds(Long roleId);

    /**
     * 获取角色的首页
     *
     * @param roleId 角色ID
     * @return 角色首页
     */
    String getRoleHomePage(Long roleId);

    /**
     * 设置角色的首页
     *
     * @param roleHomeForm 角色首页信息
     */
    void updateRoleHomePage(RoleHomeForm roleHomeForm);

    // ========== 角色-菜单的相关方法  ==========

    /**
     * 设置角色菜单
     *
     * @param roleId  角色编号
     * @param menuIds 菜单编号集合
     */
    void assignRoleMenu(Long roleId, Set<Long> menuIds);

    /**
     * 获取用户拥有的角色ID集合
     *
     * @param userId 用户ID
     * @return 角色ID集合
     */
    Set<Long> getUserRoleIdListByUserId(Long userId);

    /**
     * 获得角色们拥有的菜单编号集合
     *
     * @param roleIds 角色编号数组
     * @return 菜单编号集合
     */
    Set<Long> getRoleMenuListByRoleId(Set<Long> roleIds);

    /**
     * 赋予用户角色
     *
     * @param userId  用户ID
     * @param roleCodes 角色ID集合
     */
    void assignUserRole(Long userId, Set<String> roleCodes);
}

